package com.zero.guava.samples.Cache;


import com.google.common.cache.CacheBuilder;
import com.google.common.cache.CacheLoader;
import com.google.common.cache.LoadingCache;

import java.util.concurrent.ExecutionException;

/**
 * LoadingCache是Cache的子接口,相比较于Cache,当从LoadingCache中读取一个指定key
 * 的记录时,如果该记录不存在,则LoadingCache可以自动执行加载数据到缓存的操作.
 * 在调用CacheBuilder的build方法时,必须传递一个CacheLoader类型的参数,CacheLoader
 * 的load方法需要我们提供实现.当调用LoadingCache的get方法时,如果缓存不存在对应key的
 * 记录,则CacheLoader中的load方法会被自动调用从外存加载数据.load方法的返回值会作为key
 * 对应的value存储到LoadingCache中,并从get方法返回.
 */
public class LoadingCacheTest {

    public static void main(String[] args) throws ExecutionException {

        CacheLoader<String, String> loader = new CacheLoader<String, String>() {
            @Override
            public String load(String key) throws Exception {
                Thread.sleep(1000);
                System.out.println(key + " is loaded from a cacheLoader!");
                return key + "'s value";
            }
        };


        LoadingCache<String, String> cache = CacheBuilder
                .newBuilder().maximumSize(3).build(loader);

         cache.get("key1");
         cache.get("key2");
         cache.get("key3");
    }

}
